home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr36
/
putt100.zip
/
CAPI.ZIP
/
JAMSCAN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-01
|
9KB
|
259 lines
/*
** JAM(mbp) - The Joaquim-Andrew-Mats Message Base Proposal
**
** C API
**
** Written by Joaquim Homrighausen.
**
** ----------------------------------------------------------------------
**
** jamscan.c (JAMmb)
**
** Scan message headers and call user comparison routine
**
** Copyright 1993 Joaquim Homrighausen, Andrew Milner, Mats Birch, and
** Mats Wallin. ALL RIGHTS RESERVED.
**
** 93-06-28 JoHo
** Initial coding. No decryption or unescaping supported yet.
*/
#define JAMCAPI 1
#include "jammb.h"
/*
** Scan message headers starting at the specified number (WhatMsg). For
** each header found, the function calls USERCOMPARE. The ScanFwd parameter
** determines the direction of the scan. The Hdr record will contain the
** newly read message header and if the header had any subfields, WorkBuf
** will contain as much subfield data as will fit. If all of the subfield
** data didn't fit and the USERCOMPARE function returns ScanMsgHdrDiscard,
** the function will read the remaining subfield data and call the user
** function again. Returns 1 if user function returned ScanMsgHdrStop and
** FALSE otherwise.
*/
int _JAMPROC JAMmbScanForMsgHdr(JAMAPIRECptr apirec, UINT32 WhatMsg,
int ScanFwd, ScanMsgHdrComp UserCompare)
{
int UserResult;
INT32 JunkL, MaxBlockToRead;
UINT32 ReadBytes;
/* Make sure the message number is valid */
if (WhatMsg<apirec->HdrInfo.BaseMsgNum)
{
apirec->APImsg=JAMAPIMSG_INVMSGNUM;
return (0);
}
while (1)
{
/* Seek to position for current message */
if (!JAMmbFetchMsgIdx(apirec, WhatMsg))
return (0);
if (apirec->SeekFunc(apirec, apirec->HdrHandle, JAMSEEK_SET, apirec->Idx.HdrOffset)!=(INT32)apirec->Idx.HdrOffset)
{
apirec->APImsg=JAMAPIMSG_SEEKERROR;
return (0);
}
JunkL=apirec->ReadFunc(apirec, apirec->HdrHandle, &apirec->Hdr, (INT32)sizeof(JAMHDR));
if (JunkL==(INT32)sizeof(JAMHDR))
{
apirec->LastMsgNum=WhatMsg;
/* If all subfield data will fit, read it all and call user function */
if (apirec->Hdr.SubfieldLen<=apirec->WorkLen)
{
if (apirec->Hdr.SubfieldLen>0)
{
if (apirec->ReadFunc(apirec, apirec->HdrHandle, &apirec->WorkBuf, (INT32)apirec->Hdr.SubfieldLen)!=(INT32)apirec->Hdr.SubfieldLen)
{
apirec->APImsg=JAMAPIMSG_CANTRDFILE;
return (0);
}
}
/* Call user function and process result */
UserResult=UserCompare(apirec);
if (UserResult==ScanMsgHdrStop)
{
return (1);
}
else
{
if (ScanFwd)
WhatMsg++;
else
{
if (WhatMsg==apirec->HdrInfo.BaseMsgNum)
{
apirec->APImsg=JAMAPIMSG_NOMOREMSGS;
return (0);
}
else
WhatMsg--;
}
}
}
else
/* All subfield data won't fit, do segmented read/calls */
{
ReadBytes=0L;
MaxBlockToRead=(INT32)apirec->WorkLen;
do
{
if (apirec->ReadFunc(apirec, apirec->HdrHandle, &apirec->WorkBuf, MaxBlockToRead)!=MaxBlockToRead)
{
apirec->APImsg=JAMAPIMSG_CANTRDFILE;
return (0);
}
if (MaxBlockToRead>0L)
UserResult=UserCompare(apirec);
ReadBytes+=MaxBlockToRead;
if ((INT32)(apirec->Hdr.SubfieldLen-ReadBytes)<MaxBlockToRead)
MaxBlockToRead=(INT32)(apirec->Hdr.SubfieldLen-ReadBytes);
}
while (ReadBytes<apirec->Hdr.SubfieldLen &&
MaxBlockToRead>0L &&
UserResult==ScanMsgHdrDiscard);
/* We've read all subfield data or got told to proceed */
if (UserResult==ScanMsgHdrStop)
{
return (1);
}
else
{
if (ScanFwd)
WhatMsg++;
else
{
if (WhatMsg==apirec->HdrInfo.BaseMsgNum)
{
apirec->APImsg=JAMAPIMSG_NOMOREMSGS;
return (0);
}
else
WhatMsg--;
}
}
}
}
else
{
/* Check for end of file, otherwise error */
if (JunkL==0L && ScanFwd)
apirec->APImsg=JAMAPIMSG_NOMOREMSGS;
else
apirec->APImsg=JAMAPIMSG_CANTRDFILE;
return (0);
}
}/*while*/
/* Dummy return to avoid warnings from some compilers */
return (0);
}
/*
** Scan message index records starting at the specified number (STARTNUM).
** For each record found, the function calls USERCOMPARE. The ScanFwd
** parameter determines the direction of the scan. The Idx record will
** contain the newly read index record. Returns 1 if user function returned
** ScanMsgHdrStop and FALSE otherwise.
*/
int _JAMPROC JAMmbScanForMsgIdx(JAMAPIRECptr apirec, UINT32 WhatMsg,
int ScanFwd, ScanMsgIdxComp UserCompare)
{
int UserResult;
INT32 WhatOffset, ReadCount;
/* Make sure it's open */
if (!apirec->isOpen)
{
apirec->APImsg=JAMAPIMSG_ISNOTOPEN;
return (0);
}
/* Make sure the message number is valid */
if (WhatMsg<apirec->HdrInfo.BaseMsgNum)
{
apirec->APImsg=JAMAPIMSG_INVMSGNUM;
return (0);
}
WhatOffset=(INT32)((WhatMsg-apirec->HdrInfo.BaseMsgNum) * (INT32)sizeof(JAMIDXREC));
/* Seek to position if we're going forward */
if (ScanFwd)
{
if (apirec->SeekFunc(apirec, apirec->IdxHandle, JAMSEEK_SET, WhatOffset)!=WhatOffset)
{
apirec->APImsg=JAMAPIMSG_SEEKERROR;
return (0);
}
}
/* Fetch index records */
while (1)
{
/* Seek to position if we're going backward */
if (!ScanFwd)
{
if (apirec->SeekFunc(apirec, apirec->IdxHandle, JAMSEEK_SET, WhatOffset)!=WhatOffset)
{
apirec->APImsg=JAMAPIMSG_SEEKERROR;
return (0);
}
}
ReadCount=apirec->ReadFunc(apirec, apirec->IdxHandle, &apirec->Idx, (INT32)sizeof(JAMIDXREC));
if (ReadCount==(INT32)sizeof(JAMIDXREC))
{
apirec->LastMsgNum=WhatMsg;
/* Call user function and process result */
UserResult=UserCompare(apirec);
if (UserResult==ScanMsgIdxStop)
{
return (1);
}
else
{
if (ScanFwd)
WhatMsg++;
else
{
if (WhatMsg==apirec->HdrInfo.BaseMsgNum)
{
apirec->APImsg=JAMAPIMSG_NOMOREMSGS;
return (0);
}
else
{
WhatMsg--;
WhatOffset-=(INT32)sizeof(JAMIDXREC);
}
}
}
}
else
{
/* Check for end of file, otherwise error */
if (ReadCount==0L && ScanFwd)
apirec->APImsg=JAMAPIMSG_NOMOREMSGS;
else
apirec->APImsg=JAMAPIMSG_CANTRDFILE;
return (0);
}
}/* while */
/* Dummy return to avoid warnings from some compilers */
return (0);
}
/* end of file "jamscan.c" */